//
//  VirtualFun.h
//  HelloWorld
//
//  Created by Kevin Tang on 1/12/14.
//  Copyright (c) 2014年 Kevin Tang. All rights reserved.
//

#ifndef __HelloWorld__VirtualFun__
#define __HelloWorld__VirtualFun__

#include <stdio.h>

class AbstractBase{
public:
    //纯虚函数，表示类AbstractBase,是个抽象类，不可以实例化。它相当于心Java中的接口。
    //继承它的子类，必须要实现这个纯虚函数，才能实例化。否则不能实例化。
    //所以当我们希望某个方法，在它的子类中被重新定义，即有子类自己的实现时，我们使用虚函数。
    virtual void v_purefun() = 0;
};

class VirtualBase {
public:
    void fun();
    virtual void v_fun();
};

class VirtualInherit:public VirtualBase{
public:
    void fun();
    virtual void v_fun();////这里无论是否写 virtual 此方法都是虚方法,它的子类如果有此方法，都是虚方法
};

class Subc:public VirtualInherit
{
public:
    void v_fun();////这里无论是否加 virtual 它都是虚方法
};



//为了解决多重继承中的，一个变量保存多份的问题，引入了虚继承。
class A{
public:
    int a;
};

class   B : public A{
    //继承了基类A的成员 a;
};
class C :public A{
   //继承了基类A的成员 a;
};

class D: public  B,public  C{//多重继承
    //由于本类继承了B,C.因此这个类中有两个a.当对其进行操作时，会出现编译错误，表示引用的变量，不明确。不知是那一个。
};

class E: public virtual B,public virtual C{
    //由于使用了虚拟继承，这样就解决了问题
};

//==============================================
template <typename T1,typename T2>
class Small {
private:
    T1 i;
    T2 j;
    
public:
    Small(T1,T2);//constructor
    void show();
};

class Dog{
public:
    Dog(){
        age =1;
    }
protected:
    int age;
};

class Animal{
public:
    Animal(int a=0){
        this->a = 1;
    }
protected:
    Dog _dog;//会先调用Dog(),会对其进行初始化
    int a;
};

//==============dynamic_cast和static_cast=============

class Base
{
public:
    int m_iNum;
    virtual void foo(){
        printf("base foo\n");
    }
};

class Derived:public Base
{
public:
    std::string m_szNme="DerivedDerivedDerivedDerivedDerivedDerivedDerived";
    void output(){
        printf("Derived output\n");
        std::cout<< m_szNme <<std::endl;
    }
};


class Derived1:public Base
{

};

class Derived2:public Base
{
    
};


#endif /* defined(__HelloWorld__VirtualFun__) */
